package com.school.sports.service.Impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.school.sports.entity.Award;
import com.school.sports.mapper.AwardMapper;
import com.school.sports.service.AwardService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 奖项服务实现类
 * 实现了 AwardService 接口中定义的所有业务方法
 */
@Service
public class AwardServiceImpl extends ServiceImpl<AwardMapper, Award> implements AwardService {

    // 日志记录器
    private static final Logger logger = LoggerFactory.getLogger(AwardServiceImpl.class);

    /**
     * 分页查询奖项列表
     * @param currentPage 当前页码
     * @param pageSize 每页显示数量
     * @param award 查询条件对象
     * @return 包含奖项数据的分页对象
     */
    @Override
    public IPage<Award> getPage(int currentPage, int pageSize, Award award) {
        logger.info("分页查询奖项列表，当前页码：{}，每页条数：{}，查询条件：{}", currentPage, pageSize, award);

        // 参数校验，确保页码和每页数量为有效正数
        if (currentPage <= 0) {
            currentPage = 1;
        }
        if (pageSize <= 0) {
            pageSize = 10;
        }

        // 创建Lambda查询包装器，用于构建条件查询
        LambdaQueryWrapper<Award> queryWrapper = new LambdaQueryWrapper<>();

        // 添加查询条件，如果传入了查询对象
        if (award != null) {
            // 用户ID精确查询
            queryWrapper.eq(award.getUserId() != null, Award::getUserId, award.getUserId());

            // 项目ID精确查询
            queryWrapper.eq(award.getProjectId() != null, Award::getProjectId, award.getProjectId());

            // 奖项等级精确查询
            queryWrapper.eq(award.getAwardLevel() != null && !award.getAwardLevel().isEmpty(),
                    Award::getAwardLevel, award.getAwardLevel());
        }

        // 按颁发时间降序排序，确保最新的数据显示在前面
        queryWrapper.orderByDesc(Award::getIssuedAt);

        // 创建分页对象，设置当前页码和每页显示数量
        IPage<Award> page = new Page<>(currentPage, pageSize);

        // 执行分页查询，将结果填充到page对象中
        this.baseMapper.selectPage(page, queryWrapper);

        logger.info("分页查询完成，共{}条记录，当前第{}页", page.getTotal(), page.getCurrent());

        return page;
    }

    /**
     * 按条件查询奖项列表
     * @param award 查询条件对象
     * @return 奖项列表
     */
    @Override
    public List<Award> listByCondition(Award award) {
        logger.info("按条件查询奖项列表，查询条件：{}", award);

        // 创建Lambda查询包装器，用于构建条件查询
        LambdaQueryWrapper<Award> queryWrapper = new LambdaQueryWrapper<>();

        // 添加查询条件
        if (award != null) {
            // 用户ID精确查询
            queryWrapper.eq(award.getUserId() != null, Award::getUserId, award.getUserId());

            // 项目ID精确查询
            queryWrapper.eq(award.getProjectId() != null, Award::getProjectId, award.getProjectId());

            // 奖项等级精确查询
            queryWrapper.eq(award.getAwardLevel() != null && !award.getAwardLevel().isEmpty(),
                    Award::getAwardLevel, award.getAwardLevel());
        }

        // 按颁发时间降序排序
        queryWrapper.orderByDesc(Award::getIssuedAt);

        // 执行查询，返回结果列表
        List<Award> result = this.baseMapper.selectList(queryWrapper);

        logger.info("查询完成，共{}条记录", result != null ? result.size() : 0);
        return result;
    }
}